package com.zoe.app.config;

import com.zoe.app.entity.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * @author zoe.Zhang
 * @date 2022/05/13
 * @description https://www.cnblogs.com/haha12/p/11304738.html
 */
@Configuration
public class BeanConfiguration {
    @Bean("nick")
    @ConfigurationProperties(prefix = "user")
    /**
     * value：和name一个意思，和name只能存在一个，表示和perfix拼接的属性名
     * name：和value一个意思，和value只能存在一个，表示和perfix拼接的属性名
     * prefix：属性前缀
     * havingValue：看看value或者name中的属性值是否一致
     * matchIfMissing：如果为true，value或者name中的属性缺失了也会生效，配置也会生效，如果为false则并不会
     * 这段注解的意思：获取application的配置文件中，前缀为user.animal ， 有没有enable 属性，如有该属性，并且他的值为 ”开启“，那么就生效，否则不会。如果没有enable属性也会生效，因为matchIfMissing的存在
     */
    @ConditionalOnProperty(name = "enable", prefix = "user.animal", havingValue = "开启", matchIfMissing = true)
    User user() {
        return new User();
    }

    @Bean("win")
    @ConfigurationProperties(prefix = "user")
    /**
     * 判断该Condition.matches的返回是true还是false,返回true就生效
     */
    @Conditional(WindowCondition.class)
    User user1() {
        return new User();
    }

    @Bean("linux")
    @ConfigurationProperties(prefix = "user")
    @Conditional(LinuxCondition.class)
    User user2() {
        return new User();
    }

    @Bean("mac")
    @ConfigurationProperties(prefix = "user")
    /**
     * 如果容器里面没有linux这个bean 则生效。
     */
    @ConditionalOnMissingBean(name = "linux")
    User user3() {
        return new User();
    }
}
